// 函数
package main

// func add(a int, b int) int {
// 	return a + b
// }

// func demo(b int, a ...int) int { // 可变参数 和Python一样，固定参数在前，可变参数在后
// 	var sum int = 0
// 	for _, v := range a {
// 		sum += v
// 	}
// 	return sum * b
// }

// func add_sub(a int, b int) (int, int, string) {
// 	return a + b, a - b, "Defalt"
// }

// // Go 中支持返回值命名。 即直接定义返回值
// func demo1(a int, b int) (ret int, test string) {
// 	ret = a * b
// 	test = "mul func"
// 	return // 只写一个return 会自动返回
// }

// // 可以自定义函数类型 --> 自定义普通类型
// type demo2 func(int, int) int // var c = demo2 -->  c = add1  --> add1(1, 2) == c(1, 2)

// func add1(x int, y int) int {
// 	return x + y
// }

// // 函数做为参数
// func calc(x, y int, ca demo2) int {
// 	return ca(x, y)

// }

// // 函数作为返回值
// func demo3(op string) func(int, int) int {
// 	switch op {
// 	case "+":
// 		return add1
// 	case "-":
// 		return func(x, y int) int { // 匿名方法
// 			return x - y
// 		}
// 	default:
// 		return nil
// 	}
// }

// func niming() int {
// 	a := 0
// 	defer func() {
// 		a++
// 	}()
// 	return a
// }

// func mingming(a int) int {
// 	defer func() {
// 		a++
// 	}()
// 	return a
// }

// func fn1() {
// 	fmt.Println("fn1")
// }

// func fn2() {
// 	defer func() { // recover 在 defer 函数 中才行
// 		err := recover()
// 		if err != nil {
// 			fmt.Println("error")
// 		}
// 	}()
// 	panic("抛掷一个异常")
// }

// func fn3() int {
// 	defer func() {
// 		err := recover()
// 		if err != nil {
// 			fmt.Println("error:", err)
// 		}
// 	}()
// 	var a = 10
// 	var b = 0
// 	return a / b
// }

// func fn4(test string) error {
// 	if test == "test" {
// 		return nil
// 	} else {
// 		return errors.New("test错误")
// 	}
// }

// func testFn4(test string) {
// 	defer func() {
// 		e := recover()
// 		if e != nil {
// 			fmt.Println("error")
// 		}
// 	}()
// 	err := fn4(test)
// 	if err == nil {
// 		fmt.Println("suc")
// 	} else {
// 		panic(err)
// 	}
// }

// func main() {
// 格式
/*
	func 函数名(参数)(返回值) { // { 不能另起一行  返回值只有一个 不用加括号
	}
*/
// fmt.Println(add(1, 2))
// fmt.Println(demo(2, 1, 2, 3, 4))
// add, sub, LH := add_sub(5, 7)
// fmt.Println(add, sub, LH)
// ret, t := demo1(1, 2)
// fmt.Println(ret, t)

// var c demo2
// c = add1
// fmt.Println(c(1, 2))

// fmt.Println(calc(1, 2, add1))

// 匿名函数
// fmt.Println(calc(2, 4, func(x, y int) int { return x * y }))

// var A = demo3("+")
// fmt.Println(A(1, 2))

// var B = demo3("-")
// fmt.Println(B(1, 2))

// func() {
// 	fmt.Println("匿名自执行函数1")
// }()

// var fn = func(x int) {
// 	fmt.Println("匿名自执行函数", x)
// }
// fn(8)

// defer 语句
// fmt.Println("开始")
// defer fmt.Println("1") // 压栈 1 2 3 <--
// defer fmt.Println("2")
// defer fmt.Println("3")
// fmt.Println("结束")

// panic 抛出/ recover 接收
// fn1()
// fn2()
// fmt.Println(fn3()) // 计算失败默认返回一个0
// fmt.Println("结束")
// testFn4("test")
// }
